home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 7 / PC World Interactive 7.iso / program / cprog.EXE / VIEWSCR.C < prev    next >
C/C++ Source or Header  |  1995-10-02  |  6KB  |  354 lines

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <sys\types.h>
  4. #include <sys\stat.h>
  5. #include <io.h>
  6. #include <share.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <dos.h>
  10. #include <share.h>
  11. #include <conio.h>
  12. #include <limits.h>
  13. #include <direct.h>
  14. #include "view.h"
  15.  
  16. /*
  17.   View screen and input routines
  18. */
  19.  
  20. int view_getvidmode( void )
  21. {
  22.   _asm
  23.       {
  24.       mov ax,0f00h
  25.       int 10h
  26.       xor ah,ah
  27.       }
  28. }
  29.  
  30. void view_goto(int row,int col)
  31. {
  32.   view_offset = (row*(view_cols*2))+(col*2);
  33. }
  34.  
  35. void view_putc( int ochar )
  36. {
  37.   int offset = view_offset;
  38.  
  39.   screen[offset] = ochar;
  40.   offset++;
  41.   screen[offset] = view_attr;
  42.   offset++;
  43.  
  44.   view_offset = offset;
  45. }
  46.  
  47. void view_fill(int fill, int count)
  48. {
  49.   while(count > 0) 
  50.     { 
  51.     view_putc(fill);
  52.     count --; 
  53.     }
  54. }
  55.  
  56. void view_puts(UCHAR *str, int len)
  57. {
  58.   while( *str && len )
  59.     {
  60.     view_putc(*str);
  61.     str ++;
  62.     len --;
  63.     }
  64.  
  65.   while( len )
  66.     {
  67.     view_putc(' ');
  68.     len --;
  69.     }
  70. }
  71.  
  72. int view_prompt( UCHAR *title, UCHAR *prompt, UCHAR *retbuf, int retlen )
  73. {
  74.    VIEWSAVE *vs;
  75.    int row,col,width;
  76.    int ret;
  77.  
  78.    row = (view_rows/2);
  79.    width = strlen(prompt)+1+retlen+2;
  80.    col = (view_cols/2) - width/2;
  81.  
  82.    vs = view_getsave(row-1,col-1,3,width+2);
  83.  
  84.    view_attr = GET_STRING;
  85.    view_frame(title,row-1,col-1,3,width+2);
  86.    view_goto(row,col);
  87.    view_puts(prompt,width);
  88.  
  89.    ret = view_gets(row,col+1+strlen(prompt),retlen,retbuf);
  90.  
  91.    view_putsave(vs);
  92.  
  93.    return(ret);
  94. }
  95.  
  96.  
  97.  
  98. int view_gets( int row,int col, int len, UCHAR *str)
  99. {
  100.    int  offset;
  101.    char scan;
  102.  
  103.    view_attr = GET_STRING;
  104.  
  105.    offset = 0;
  106.  
  107.    for(;;)
  108.      {
  109.      view_goto(row,col);
  110.      view_puts(str,len+1);
  111.      view_goto(row,col+offset);
  112.      view_attr = GET_STRING_CURSOR;
  113.      view_puts(str+offset,1);
  114.      view_attr = GET_STRING;
  115.  
  116.      scan = getch();
  117.  
  118.      switch( scan )
  119.        {
  120.        case BACKSPACE:
  121.          if (offset > 0)
  122.            {
  123.            offset --;
  124.            str[offset] = '\0';
  125.            }
  126.        break;
  127.  
  128.        case RETURN:
  129.          str[offset] = '\0';
  130.          return(TRUE);
  131.        break;
  132.  
  133.        case ESC:
  134.          return(FALSE);
  135.        break;
  136.  
  137.        case 0:
  138.           scan = getch();
  139.        break;
  140.                                 
  141.        default:
  142.          if (scan > 31 && scan < 127)
  143.            {
  144.            if (offset < len)
  145.              {
  146.              str[offset] = scan;
  147.              offset ++;
  148.              str[offset] = '\0';
  149.              }
  150.            }
  151.        break;
  152.        }
  153.      }
  154. }
  155.  
  156. void view_frame( UCHAR *title,int row,int col,int rows,int cols )
  157. {
  158.   int r;
  159.   int off;
  160.   int mod;
  161.   int wid;
  162.   int offset;
  163.  
  164.   wid = cols-2;
  165.  
  166.   view_goto(row,col);
  167.   view_putc('┌');
  168.   view_fill('─',wid);
  169.   view_putc('┐');
  170.   view_goto(row,col+1);
  171.   view_puts(title,min(wid,strlen(title)));
  172.  
  173.   view_goto(row+1,col);
  174.  
  175.   off = ((wid)*2);
  176.   mod = (view_cols*2)-(off+4);
  177.  
  178.   offset = view_offset;
  179.  
  180.   for (r = 1; r < rows-1; r ++)
  181.     {
  182.     screen[offset]  = '│';
  183.     offset ++;
  184.     screen[offset]  = view_attr;
  185.     offset ++;
  186.     offset += off;
  187.     screen[offset]  = '│';
  188.     offset ++;
  189.     screen[offset]  = view_attr;
  190.     offset ++;
  191.     offset += mod;
  192.     }
  193.  
  194.   view_offset = offset;
  195.  
  196.   view_putc('└');
  197.   view_fill('─',wid);
  198.   view_putc('┘');
  199. }
  200.  
  201. void view_putsave( VIEWSAVE *save )
  202. {
  203.    view_unpackbuf(save->buf,save->row,save->col,save->rows,save->cols);
  204.  
  205.    free(save->buf);
  206.    free(save);
  207. }  
  208.  
  209. VIEWSAVE *view_getsave( int row,int col,int rows,int cols )
  210. {
  211.    UCHAR *buf;
  212.    VIEWSAVE *getsave;
  213.    int offset;
  214.  
  215.    getsave = malloc(sizeof(VIEWSAVE));
  216.    if (!getsave) view_error(1,"view_getsave: alloc getsave");
  217.  
  218.    getsave->row  = row;
  219.    getsave->col  = col;
  220.    getsave->rows = rows;
  221.    getsave->cols = cols;
  222.  
  223.    getsave->buf = malloc((rows*(cols*2)));
  224.    if (!getsave->buf) view_error(1,"view_getsave: alloc buf");
  225.  
  226.    buf = getsave->buf;
  227.    cols *= 2;
  228.  
  229.    view_goto(getsave->row,getsave->col);
  230.  
  231.    offset = view_offset;
  232.  
  233.    for (row = 0; row < rows; row ++)
  234.      {
  235.      for (col = 0; col < cols; col ++)
  236.        {
  237.        *buf = screen[offset];
  238.        offset ++;
  239.        buf ++;
  240.        }
  241.      offset += ((view_cols*2)-cols);
  242.      }
  243.  
  244.    view_offset = offset;
  245.  
  246.    getsave->buf = realloc(getsave->buf,view_packbuf(getsave->buf,(rows*cols)));
  247.  
  248.    return(getsave);
  249. }
  250.  
  251.  
  252. int view_packbuf( UCHAR *buf, int size )
  253. {
  254.    UCHAR *from, *to;
  255.    UCHAR count;
  256.    UCHAR idx;
  257.  
  258.    if (!*buf) *buf = ' ';
  259.  
  260.    for (count = 0,to = buf,from = buf+2; from-buf < size; from += 2)
  261.      {
  262.      if (!*from) *from = ' ';
  263.  
  264.      if (((*from == *(from-2)) && (*(from+1) == *(from-1))) && (count < 255))
  265.        count ++;
  266.      else if (count > 4)
  267.        {
  268.        *(to++) = '\0';
  269.        *(to++) = count;
  270.        *(to++) = *(from-2);
  271.        *(to++) = *(from-1);
  272.        count = 0;
  273.        }
  274.      else
  275.        {
  276.        for (idx = 0; idx <= count; idx ++)
  277.          {
  278.          *(to++) = *(from-2);
  279.          *(to++) = *(from-1);
  280.          }
  281.        count = 0;
  282.        }
  283.      }
  284.  
  285.    if (count > 4)
  286.      {
  287.      *(to++) = '\0';
  288.      *(to++) = count;
  289.      *(to++) = *(from-2);
  290.      *(to++) = *(from-1);
  291.      count = 0;
  292.      }
  293.    else
  294.      {
  295.      for (idx = 0; idx <= count; idx ++)
  296.        {
  297.        *(to++) = *(from-2);
  298.        *(to++) = *(from-1);
  299.        }
  300.      count = 0;
  301.      }
  302.  
  303.    return(to-buf);
  304. }
  305.  
  306. void view_unpackbuf( UCHAR *buf, int row, int col, int rows, int cols )
  307. {
  308.    UCHAR count,idx;
  309.    UCHAR chr,atr;
  310.    int   ccol;
  311.  
  312.    view_goto(row,col);
  313.  
  314.    rows = row+rows;
  315.    cols = col+cols;
  316.    ccol = col;
  317.  
  318.    while( row < rows )
  319.      {
  320.      if (!*buf)
  321.        {
  322.        count = *(buf+1);
  323.        chr   = *(buf+2);
  324.        atr   = *(buf+3);
  325.        buf   += 4;
  326.        }
  327.      else
  328.        {
  329.        count = 0;
  330.        chr   = *(buf);
  331.        atr   = *(buf+1);
  332.        buf   += 2;
  333.        }
  334.  
  335.      for (idx = 0; idx <= count; idx ++)
  336.        {
  337.        screen[view_offset] = chr;
  338.        view_offset ++;
  339.        screen[view_offset] = atr;
  340.        view_offset ++;
  341.        ccol ++;
  342.        if (ccol >= cols)
  343.          {
  344.          ccol = col;
  345.          row  ++;
  346.          view_goto(row,ccol);
  347.          }
  348.        }
  349.      }
  350. }
  351.  
  352.        
  353.  
  354.